home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlb20 / lib / sozobon / bcopy.s < prev    next >
Text File  |  1992-01-11  |  2KB  |  83 lines

  1. ; void bcopy(void *src, void *dst, long cnt)
  2. ;    handle overlap (both ways), odd/even alignment etc
  3. ;    ++jrb    bammi@dsrgsun.ces.cwru.edu
  4.     .text
  5.     .even
  6.     .globl _bcopy
  7. _bcopy:
  8.     move.l    4(sp),a0    ; src -> a0
  9.     move.l    8(sp),a1    ; dst -> a1
  10.     move.l    12(sp),d0    ; cnt -> d0
  11.     ble    return        ; cnt <= 0
  12.     move.l    d2,-(sp)    ; save d2
  13.  
  14.     ; check overlap
  15.     move.l    a0,d1        ; (abs(src - dst)) < cnt =>  overlap
  16.     sub.l    a1,d1
  17.     bge    L1
  18.     neg.l    d1
  19. L1:    cmp.l    d1,d0
  20.     bgt    overlap
  21.  
  22.     ; check for odd src or dst
  23.     move.w    a0,d1
  24.     move.w    a1,d2
  25.     eor.b    d1,d2
  26.     btst    #0,d2
  27.     bne    oddeven
  28.     btst    #0,d1
  29.     beq    eveneven
  30.     move.b    (a0)+,(a1)+    ; odd  odd
  31.     subq.l    #1,d0        ; now even even 
  32.  
  33. eveneven:            ; may want long alignment for 020/030 etc
  34.     move.l    d0,d1
  35.     and.b    #$1c,d1        ; 4 bytes/copy  32 bytes max/iter
  36.     lsr.l    #1,d1        ; calc index into loop (each move.l == 2bytes)
  37.     neg.l    d1        ;  
  38.     add.l    #18,d1        ; 16 + 2 bytes for jmp ext word - d1 == index
  39.     jmp    0(pc,d1)    ;  dive into loop at appro spot
  40. loop1:
  41.     move.l    (a0)+,(a1)+
  42.     move.l    (a0)+,(a1)+
  43.     move.l    (a0)+,(a1)+
  44.     move.l    (a0)+,(a1)+
  45.  
  46.     move.l    (a0)+,(a1)+
  47.     move.l    (a0)+,(a1)+
  48.     move.l    (a0)+,(a1)+
  49.     move.l    (a0)+,(a1)+
  50.  
  51.     sub.l    #32,d0
  52.     bge    loop1
  53.  
  54.     btst    #1,d0
  55.     beq    L4
  56.     move.w    (a0)+,(a1)+    ; residual word
  57. L4:    btst    #0,d0
  58.     beq    ret
  59.     move.b    (a0),(a1)        ; residual byte
  60.  
  61. ret:    move.l    (sp)+,d2
  62. return:    rts
  63.  
  64. oddeven:
  65. upcopy:                ; byte-by-byte forward
  66.     subq.l    #1,d0
  67.     blt    ret
  68.     move.b    (a0)+,(a1)+
  69.     bra    upcopy
  70.  
  71. overlap:
  72.     cmp.l    a0,a1
  73.     bmi    upcopy        ; (src > dst) go do byte/byte forward copy
  74.     add.l    d0,a0        ; otherwise backwards copy
  75.     add.l    d0,a1        ; note we use predec so 1 is not sub from addr
  76.  
  77. downcopy:            ; byte-by-byte backward
  78.     subq.l    #1,d0
  79.     blt    ret
  80.     move.b    -(a0),-(a1)
  81.     bra    downcopy
  82.